﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Collections;

namespace GIFT
{
    class ConsultaJerarquia
    {
        //Constructor de la clase
        public ConsultaJerarquia()
        {
            consulta = new Consulta();
        }

        //Busca en la base de datos el atributo de la jerarquia con el nombre que recibe como parametro
        public String buscarAtributoJerarquia(String nombre, String atributo)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[jerarquia] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                    if (atr == "NULL")
                    {
                        atr = "";
                    }
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Busca en la base de datos uno de los atributos de la jerarquia que son de tipo entero (niveles, terminos) con el nombre que recibe como parametro
        public int buscarAtributoNumericoJerarquia(String nombre, String atributo)
        {
            int atr = -99999;
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[jerarquia] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = (int)datos.GetValue(0);
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Obtiene de la base de datos todos las jerarquias existentes, y los retorna en un arreglo
        public ArrayList obtieneJerarquias()
        {
            ArrayList jerarquias = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[jerarquia]";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    jerarquias.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return jerarquias;
        }

        //Obtiene de la base de datos todos los nodos que pertenecen a una jerarquia, y los retorna en un arreglo
        public ArrayList obtieneTerminosJerarquia(String correlativoJerarquia)
        {
            ArrayList terminos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "SELECT nombre FROM [GIFT].[dbo].[termino] WHERE [correlativo jerarquia] = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    terminos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return terminos;
        }

        //Busca en la base de datos el atributo del termino con el nombre que recibe como parametro
        public String buscarAtributoTerminoPorNombre(String nombre, String atributo, String jerarquia)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[termino] Where  nombre = '" + nombre + "' and [correlativo jerarquia] = " + jerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Busca en la base de datos el atributo del termino con el id que recibe como parametro
        public String buscarAtributoTerminoPorId(String Id, String atributo, String jerarquia)
        {
            String atr = "ERROR";
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[termino] Where id = " + Id + " and [correlativo jerarquia] = " + jerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    atr = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion(); //Cierra conexion
            return atr;
        }

        //Busca nombres de las jerarquias que contengan la hilera que reciba como parametro en el nombre o la descripcion
        public ArrayList buscarConcordanciasEnJerarquia(String frase)
        {
            ArrayList campos = new ArrayList();
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select J.nombre From [GIFT].[dbo].[jerarquia] J Where J.nombre LIKE '%" + frase + "%' OR J.descripcion LIKE '%" + frase + "%'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    campos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();
            return campos;
        }

        //Borrar una jerarquia
        public void borrarJerarquia(String nombre)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[jerarquia] WHERE nombre ='" + nombre + "'";//crea la consulta
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Borrar un termino de una jerarquia
        public void borrarTermino(String nombreTermino, String correlativoJerarquia)
        {
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[termino] WHERE nombre ='" + nombreTermino + "' and [correlativo jerarquia] = " + correlativoJerarquia;//crea la consulta
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);//la ejecuta
            consulta.CierraConexion();//cierra la conexion
        }

        //Busca en la base de datos el valor booleano del atributo que pide y retorna dicho valor
        public bool estaHabilitadoCampoEnJerarquia(String nombre, String atributo)
        {
            SqlDataReader datos;
            String sentenciaSql = "Select " + atributo + " from [GIFT].[dbo].[jerarquia] Where nombre='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                while (datos.Read())
                {
                    if (datos.GetValue(0).ToString() == "True")//Si el valor es true lo retorna
                    {
                        consulta.CierraConexion();
                        return true;
                    }
                }
            }
            consulta.CierraConexion();
            return false; //Si no es true 
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos en la tabla jerarquia
        public bool existeJerarquia(String nombre)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[jerarquia] Where nombre ='" + nombre + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Recibe un nombre y retorna true si este ya existe en la base de datos en la tabla termino de jerarquia
        public bool existeTermino(String nombreTermino, String correlativoJerarquia)
        {
            SqlDataReader datos;
            String sentenciaSql;
            sentenciaSql = "Select nombre From [GIFT].[dbo].[termino] Where nombre ='" + nombreTermino + "' and [correlativo jerarquia] = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos.HasRows)//lo que se haga para saber si no retorno resultados 
            {
                consulta.CierraConexion();//Cierra la conexion
                return true;
            }
            consulta.CierraConexion();//Cierra la conexion
            return false;
        }

        //Obtiene de la base de datos los nombres de los terminos que pertenecen a la lista con el id que recibe como parametro
        public ArrayList ObtenerTerminoslista(String idLista)
        {
            ArrayList terminos = new ArrayList();
            SqlDataReader datos;
            String sentenciaSql = "SELECT T.[nombre] FROM [GIFT].[dbo].[termino_lista] T WHERE T.[correlativo lista] =  " + idLista ;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    terminos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return terminos;
        }

        //Obtiene de la base de datos el atributo que se pide de la lista con el id que recibe como parametro
        public String ObtenerAtributoListaPorId(String idLista, String atributo)
        {
            String resultado = "";
            SqlDataReader datos;
            String sentenciaSql = "SELECT "+ atributo +" FROM [GIFT].[dbo].[lista]  WHERE [correlativo] =  " + idLista;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }

        //Obtiene de la base de datos el id de la  lista con el con que recibe como parametro
        public String ObtenerIdlista(String nombreLista)
        {
            String id= "";
            SqlDataReader datos;
            String sentenciaSql = "SELECT [correlativo] FROM [GIFT].[dbo].[lista]  WHERE [nombre] =  '" + nombreLista + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    id = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return id;
        }

        //Obtiene de la base de datos el numero de niveles de la jerarquia que recibe como parametro
        public int numeroNivelesJerarquia(String nombreJerarquia)
        {
            int niveles = 0;
            SqlDataReader datos;
            String sentenciaSql = "SELECT [numero niveles] FROM [GIFT].[dbo].[jerarquia]  WHERE [nombre] =  '" + nombreJerarquia + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    niveles= (int)datos.GetValue(0);
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return niveles;
        }

        //Guarda en la base de datos una nueva jerarquia, recibe los valores a introducir 
        public void crearJerarquia(String nombre, String descripcion, String numTerminos, String numNiveles, String conCategorias, String conNiveles, String conVersion, String conNombreUnico, String fechaCreacion, String conNombreNivel, String idCategorias, String idNiveles)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[jerarquia] ([nombre],[descripcion],[fecha_actualizacion],[numero terminos],[numero niveles],[con categorias],[con niveles],[con version],[con nombre unico],[fecha creacion],[con Nombre Nivel],[id categorias], [id niveles]) VALUES ('" + nombre + "','" + descripcion + "',(GetDate())," + numTerminos + "," + numNiveles + ",'" + conCategorias + "','" + conNiveles + "','" + conVersion + "','" + conNombreUnico + "',(" + fechaCreacion + "),'" + conNombreNivel + "'," + idCategorias + "," + idNiveles + ")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Modifica una jerarquia en la base de datos
        public void modificarJerarquia(String nombre, String descripcion, String numTerminos, String numNiveles, String conCategorias, String conNiveles, String conVersion, String conNombreUnico, String conNombreNivel)
        {
            String sentenciaSql; //va a guardar la consulta a realizar
            SqlDataReader datos; //guarda el ersultado de la consulta
            sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET descripcion= '" + descripcion + "',fecha_actualizacion= (GetDate()),[numero terminos]= " + numTerminos + ",[numero niveles]= " + numNiveles + ",[con categorias]= " + conCategorias + ",[con niveles]=" + conNiveles + ",[con version]= " + conVersion + ",[con nombre unico]= " + conNombreUnico + ",[con Nombre Nivel]= " + conNombreNivel + " WHERE nombre= '" + nombre + "'"; 
            datos = consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Guarda en la base de datos un nuevo termino, recibe los valores a introducir 
        public void crearTermino(String nombre, String descripcion, String idcategoria, String idnivel, String idPadre, String version, String correlativoJerarquia)
        {
            String sentenciaSql = "INSERT INTO [GIFT].[dbo].[termino]([nombre],[descripcion],[id categoria],[id nivel],[id padre],[fecha insercion],[fecha modificacion],[version],[correlativo jerarquia]) VALUES ('" + nombre + "','" + descripcion + "'," + idcategoria + "," + idnivel + "," + idPadre + ",(GetDate()),(GetDate()),'" + version + "'," + correlativoJerarquia + ")";
            SqlDataReader datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Obtiene de la base de datos los nombres de los terminos que son hijos del id del termino recibe como parametro
        public ArrayList ObtenerTerminosHijos(String idPadre, String correlativoJerarquia)
        {
            ArrayList terminos = new ArrayList();
            SqlDataReader datos;
            String sentenciaSql = "SELECT T.[nombre] FROM [GIFT].[dbo].[termino] T WHERE T.[id padre]= " + idPadre + " and T.[correlativo jerarquia] =  " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    terminos.Add(datos.GetValue(0).ToString());
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return terminos;
        }

        //Actualiza en la base de datos el atributo que se pide en un termino con el nombre y correlativo de jerarquia que se reciben como parametros
        public void actualizarAtributoTermino(String nombreTermino, String atributo, String valor, String correlativoJerarquia)
        {
            SqlDataReader datos;
            String sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET " + atributo + " = " + valor + " WHERE nombre = '" + nombreTermino + "' and [correlativo jerarquia] = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Obtiene de la base de datos el atributo que se pide de un termino lista con el id que recibe como parametro
        public String ObtenerAtributoTerminoListaPorId(String idTerminoLIsta, String atributo)
        {
            String resultado = "";
            SqlDataReader datos;
            String sentenciaSql = "SELECT " + atributo + " FROM [GIFT].[dbo].[termino_lista]  WHERE [id] =  " + idTerminoLIsta;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }

        //Obtiene de la base de datos el atributo que se pide de un termino lista con el nombre que recibe como parametro, y el id de la lista que recibe como parametro
        public String ObtenerAtributoTerminoListaPorNombre(String nombreTerminoLIsta, String idLIsta, String atributo)
        {
            String resultado = "";
            SqlDataReader datos;
            String sentenciaSql = "SELECT " + atributo + " FROM [GIFT].[dbo].[termino_lista]  WHERE [nombre] =  '" + nombreTerminoLIsta + "' and [correlativo lista] = " + idLIsta;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }

        //Busca el nombre del termino que contenga la hilera que reciba como parametro en el nombre o la descripcion
        public String buscarConcordanciasEnTermino(String frase, String correlativoJer)
        {
            String  termino= "";
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "Select T.nombre From [GIFT].[dbo].[termino] T Where (T.nombre LIKE '%" + frase + "%' OR T.descripcion LIKE '%" + frase + "%') and [correlativo jerarquia] = " + correlativoJer;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if(datos.Read())
                {
                    termino = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();
            return termino;
        }

        //Modifica un termino en la base de datos
        public void modificarTermino(String nombre, String descripcion, String idCategoria, String version, String correlativoJerarquia)
        {
            String sentenciaSql; //va a guardar la consulta a realizar
            SqlDataReader datos; //guarda el resultado de la consulta
            sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET [descripcion] = '" + descripcion+ "',[fecha modificacion] = (GetDate()),[id categoria] = " + idCategoria + ",[version] = '" + version + "' WHERE nombre = '" + nombre+ "' and [correlativo jerarquia] = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql); //Ejecuta la consulta
            consulta.CierraConexion();//Cierra la conexion
        }

        //Actualiza en la base de datos el atributo que se pide en una jerarquia con el nombre de jerarquia que se recibe como parametros
        public void actualizarAtributoJerarquia(String nombreJerarquia, String atributo, String valor)
        {
            SqlDataReader datos;
            String sentenciaSql = "UPDATE [GIFT].[dbo].[jerarquia] SET " + atributo + " = " + valor + " WHERE nombre = '" + nombreJerarquia + "'";
            datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Cambia el id de padre de todos los hijos que tengan como id padre el que entra como parametro
        public void cambiaPadreHijos(String idPadre, String idNuevo, String correlativoJerarquia)
        {
            SqlDataReader datos;
            String sentenciaSql = "UPDATE [GIFT].[dbo].[termino] SET [id padre] = " + idNuevo + " WHERE [id padre]=" + idPadre + " and [correlativo jerarquia] = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Elimina todos los niveles que pertencen a la jerarquia que tiene el correlativo que recibo como parametro
        public void eliminarNiveles(String correlativo)
        {
            SqlDataReader datos;
            String sentenciaSql = "DELETE FROM [GIFT].[dbo].[nivel] WHERE [id termino lista] in (SELECT T.[id] FROM [GIFT].[dbo].[termino_lista] T, [GIFT].[dbo].[lista] L, [GIFT].[dbo].[jerarquia] J WHERE T.[correlativo lista] = L.correlativo and L.correlativo = J.[id niveles] and J.[correlativo] = " + correlativo + ")";
            datos = consulta.HacerConsulta(sentenciaSql);
            consulta.CierraConexion();//Cierra la conexion
        }

        //Crea un nivel, y retorna su id 
        public String creaNivel(String numeroNivel, String idTerminoLista)
        {
            String idNivel = "";
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "INSERT INTO [GIFT].[dbo].[nivel] ([numero nivel] ,[id termino lista]) VALUES (" + numeroNivel +","+ idTerminoLista +")";
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    idNivel = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();
            return idNivel;
        }

        //Obtiene el numero de orden de un termino de una lista
        public int obtenerNumeroOrdenTerminoLista(String nombreTermino, String idTerminoLista)
        {
            int orden = -1;
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "SELECT [orden] FROM [GIFT].[dbo].[termino_lista] WHERE [nombre]= '"+nombreTermino +"' and [correlativo lista]= "+idTerminoLista;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    orden = (int)datos.GetValue(0);
                }
            }
            consulta.CierraConexion();
            return orden;
        }

        //Obtiene el id de un nivel con el numero de nivel que recibe, y que sea utilizado en la jerarquia que recibe
        public String obtenerIdNivelDeJerarquia(String numeroNivel, String correlativoJerarquia)
        {
            String idNivel = "";
            String sentenciaSql;
            SqlDataReader datos;
            sentenciaSql = "SELECT N.[id] FROM [GIFT].[dbo].[nivel] N, [GIFT].[dbo].[termino_lista] T ,[GIFT].[dbo].[jerarquia] J  WHERE N.[numero nivel]= " + numeroNivel + " and N.[id termino lista] = T.id and T.[correlativo lista] = J.[id niveles] and J.correlativo = " + correlativoJerarquia;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null)
            {
                if (datos.Read())
                {
                    idNivel = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();
            return idNivel;
        }

        //Obtiene de la base de datos el atributo que se pide del nivel con el id que recibe como parametro
        public String ObtenerAtributoNivel(String idNivel, String atributo)
        {
            String resultado = "";
            SqlDataReader datos;
            String sentenciaSql = "SELECT " + atributo + " FROM [GIFT].[dbo].[nivel]  WHERE [id] =  " + idNivel;
            datos = consulta.HacerConsulta(sentenciaSql);
            if (datos != null) //si hay datos se llenan los campos
            {
                while (datos.Read())
                {
                    resultado = datos.GetValue(0).ToString();
                }
            }
            consulta.CierraConexion();//Cierra la conexion
            return resultado;
        }


        //Variables globales
        private Consulta consulta;
    }
}
